package app

import (
	"io"
	"log"
	"os"
	"time"

	"github.com/kataras/golog"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/context"
	"github.com/kataras/iris/v12/middleware/logger"
)

/*
程序内调用日志功能
app.Logger() or app.LoggerWithCtx()
*/

// Logger 返回 Logger 实例
func Logger() *golog.Logger {
	app := iris.New()
	return app.Logger()
}

// LoggerWithCtx 返回 Log 实例
func LoggerWithCtx(ctx iris.Context) *golog.Logger {
	return ctx.Application().Logger()
}

// InitLogs 本应用程序日志记录设置
func InitLogs(app *iris.Application) {
	log.Println("初始日志模块 开始..")

	app.Logger().SetLevel("warn")
	app.Use(logRequest())
	logdir := "static/logs/" + time.Now().Format("2006-01") + "/"
	/**
	常用权限使用
	0755 常用在网络服务器上。所有者可以读，写，执行。其他人都可以读取并执行，但不能修改该文件。
	0777 每个人都可以读写和执行。在网络服务器上，建议不要将777权限用于文件和文件夹，因为它允许任何人将恶意代码添加到服务器。
	0644 只有拥有者才能读取和写入。其他人只能阅读。没有人可以执行该文件。
	0655 只有所有者可以读写，但不能执行文件。其他人都可以读取和执行，但无法修改该文件。
	*/
	err := os.MkdirAll(logdir, 0755)
	if err != nil {
		log.Println("创建日志目录失败：", err.Error())
		panic(err)
	}

	filename := logdir + time.Now().Format("2006-01-02") + ".log"
	f, err := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0755)
	if err != nil {
		log.Println("创建日志文件失败：", err.Error(), "日志文件：", filename)
		panic(err)
	}
	//defer f.Close()
	app.Logger().SetOutput(io.MultiWriter(f, os.Stdout))

	log.Println("初始日志模块 完成..")
	log.Println("日志文件存放在：", filename)
}

func logRequest() context.Handler {
	// 访问日志配置
	request := logger.New(logger.Config{
		// Status displays status code
		Status: true,
		// IP displays request's remote address
		IP: true,
		// Method displays the http method
		Method: true,
		// Path displays the request path
		Path: true,
		// Query appends the url query to the Path.
		Query: true,
		// if !empty then its contents derives from `ctx.Values().Get("logger_message")
		// will be added to the logs.
		MessageContextKeys: []string{"logger_message"},
		// if !empty then its contents derives from `ctx.GetHeader("User-Agent")
		// MessageHeaderKeys: []string{"User-Agent"},
	})
	return request
}
